package com.xiaoban.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xiaoban.mapper.SysMenuMapper;
import com.xiaoban.mapper.UsersMapper;
import com.xiaoban.pojo.LoginSyUser;
import com.xiaoban.pojo.Users;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @Title: CustomUserDetailsService
 * @Author @小班哥
 * @Package com.xiaoban.service.impl
 * @Date 2024/3/15 14:20
 * @description: 请描述一下这个类是干嘛的
 */
@Slf4j
@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UsersMapper mapper;

    @Autowired
    private SysMenuMapper sysMenuMapper;

    /**
     * 根据用户名加载用户的认证信息的方法。
     * 当用户尝试登录时，Spring Security 会调用这个方法来加载用户的认证信息，
     * 包括用户名、密码和权限等信息。如果找不到对应用户名的用户信息，
     * 则会抛出 UsernameNotFoundException 异常。
     *
     * @param username 要加载的用户的用户名
     * @return 加载的用户的认证信息（实现了 UserDetails 接口的对象）
     * @throws UsernameNotFoundException 如果找不到对应用户名的用户信息
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws RuntimeException {
        Users users = mapper.selectByName(username);
        if (Objects.isNull(users)){
            log.error("用户名不存在:{}" , username);
                throw new RuntimeException("用户名不存在");
        }
        //查询用户的权限
        List<String> list = sysMenuMapper.selectPermsByUserId(users.getId());
        //封装成UserDetails返回
        return new LoginSyUser(users,list);
    }
}
